import * as _ from './utils/underscore';

// 输入 kevin 返回 HELLO,KEVIN
// kevin -> HELLO, KEVIN
// var toUpperCase = function (x) {
//   return x.toUpperCase();
// }
// var hello = function (x) {
//   return 'HELLO, ' + x;
// }

// var greet = function (x) {
//   return hello(toUpperCase(x));
// }

// console.log(greet('Kevin'));

// compose
// var compose = function (f1, f2) {
//   return function (x) {
//     return f1(f2(x));
//   };
// };

// function toUpperCase (x) {
//   return x.toUpperCase();
// }

// function hello (x) {
//   return 'HELLO, ' + x;
// }

// var greet = compose(hello, toUpperCase);

// console.log(greet('Kevin'));

// underscore compose
// var compose = function () {
//   var args = arguments;
//   var start = args.length - 1;
//   return function () {
//     var i = start;
//     var result = args[start].apply(this, arguments);
//     while (i--) result = args[i].call(this, result);
//     return result;
//   }
// }

// redux compose
const compose = (...fns) => fns.reduce((a, b) => args => a(b(args)));
// var toUpperCase = x => x.toUpperCase();
// var hello = x => 'HELLO, ' + x;

// var greet = compose(hello, toUpperCase);
// console.log(greet('zhouyang'));

// pointfree
// 非 pointfree ， 因为提到了数据： name
var greet = function (name) {
  return ('hello ' + name).toUpperCase();
}

// pointfree
// pointfree 指的是函数无须提及将要操作的数据是什么样的
// 先定义基本运算，这些可以封装起来复用

var curry = function (fn) {
  var args = [].slice.call(arguments, 1);
  return function () {
    var newArgs = args.concat([].slice.call(arguments));
    return fn.apply(this, newArgs);
  }
}

// 输入 kevin daisy kelly 返回 K.D.K
// var initials = function (name) {
//   return name.split(' ').map(item => item.slice(0, 1)).join('.').toUpperCase();
// }
// console.log(initials('kevin daisy kelly'));
// 先定义基本运算
var split = _.curry((separator, str) => str.split(separator));
var head = x => x.slice(0, 1);
var toUpperCase = x => x.toUpperCase();
var join = _.curry((separator, arr) => arr.join(separator));
var map = _.curry((fn, arr) => arr.map(fn));

var initials = compose(join('.'), map(compose(toUpperCase, head)) ,split(' '))

console.log(initials('kevin daisy kelly'));
